﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Diagnostics;
//Librerias Arquitectura
using Com.Binaria.Core;
using Com.Binaria.Core.Base;
using Com.Binaria.Core.Dto;
using Com.Binaria.Core.Util;
using Com.Binaria.Core.Datos;
using Com.Binaria.Core.Exceptions;
using Com.Binaria.Core.Enumeracion;
//Librerias Proyecto
using Com.Binaria.SISCOB.Funcional.DTO;
using Com.Binaria.SISCOB.DTO;
using Com.Binaria.SISCOB.DAO;

namespace Com.Binaria.SISCOB.Dom
{
/// <summary>
///	clase de sucursal dom
/// </summary>
    public partial class RegistroContableDom : IRegistroContableDom
{

       
        #region metodos publicos

	
	
    /// <summary>
    /// Metodo que permite registrar elementos de tipo sucursal en el sistema
    /// </summary>
    /// <param name="p_Contexto">informacion del contexto</param>
    /// <param name="p_Sucursal">sucursal a registrar (insertar, actualizar o eliminar)</param>
    /// <param name="p_Accion">Accion a realizar</param>
        public RegistroContableDTO ProbarRegistrar(ContextoDTO p_Contexto, RegistroContableDTO p_RegistroContable)
        {
            //Prefijo del Metodo
            const String MPREFIX = " [ProbarRegistrar]";
            //Resultado accion insertar
            List<RegistroContableDTO> listRegistroContableResultDTO = null;
            //RegistroContableDTO registroContableResultDTO = null;

            try
            {
                //Registro log de inicio del proceso
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Inicio);

                //Valida que exista informacion en el objeto
                AssertNull.notNullOrEmpty(p_RegistroContable);

                listRegistroContableResultDTO = BuscarRegistroContableFiltro(p_Contexto, new RegistroContableDTO() { IdCartolaMayor = p_RegistroContable.IdCartolaMayor, FchRegistro = p_RegistroContable.FchRegistro, Monto = p_RegistroContable.Monto, NmrDcto = p_RegistroContable.NmrDcto, NmrAsiento = p_RegistroContable.NmrAsiento });
                if (listRegistroContableResultDTO.Count == 0)
                {
                    listRegistroContableResultDTO = RegistrarRegistroContable(p_Contexto, new List<RegistroContableDTO>() { p_RegistroContable }, EnumRegistrarAccion.Agregar);
                }
                else
                {
                    // Si el registro_contable NO esta procesado se puede modificar
                    if (!listRegistroContableResultDTO[0].EstaProcesado.Value)
                    {
                        p_RegistroContable.Id = listRegistroContableResultDTO[0].Id;
                        listRegistroContableResultDTO = RegistrarRegistroContable(p_Contexto, new List<RegistroContableDTO>() { p_RegistroContable }, EnumRegistrarAccion.Modificar);
                        listRegistroContableResultDTO.Add(p_RegistroContable);
                    }
                    else
                    {
                        listRegistroContableResultDTO = new List<RegistroContableDTO>();
                        listRegistroContableResultDTO.Add(p_RegistroContable);
                    }
                }

                //Registro log de ejecucion el termino del metodo
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Termino);
            }
            catch (ManagerException me)
            {
                throw (me);
            }
            catch (ArquitecturaException ae)
            {
                throw (ae);
            }
            catch (Exception ex)
            {
                //Registro log de ejecucion con problemas
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Ejecucion_Problemas);
                //Genero error
                throw new ManagerException(Factoria.GetMessage("DOM_ERROR_NO_MANEJADO"), ex);
            }
            return listRegistroContableResultDTO[0];
        }


        public List<RegistroContableDTO> BuscarRegistroContableByEgreso(ContextoDTO p_Contexto, RegistroContableDTO regCont)
        {
            //Prefijo del Metodo
            const string MPREFIX = " [BuscarRegistroContableByEgreso(ContextoDTO, RegistroContableDTO)]";
            //Crea lista de objetos de salida
            List<RegistroContableDTO> RespuestaBuscar = new List<RegistroContableDTO>();

            try
            {
                //Registro log de inicio del proceso
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Inicio);

                //Valida que exista informacion a insertar
                AssertNull.notNullOrEmpty(regCont);

                //Obtengo la lista de objetos almacenados en la base de datos
                RespuestaBuscar = iRegistroContableDAO.BuscarRegistroContableByEgreso(regCont);

                //Registro log de termino OK del proceso
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Ejecucion_Ok);
                //Registro log de ejecucion el termino del metodo
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Termino);
            }
            catch (ManagerException me)
            {
                throw (me);
            }
            catch (ArquitecturaException ae)
            {
                throw (ae);
            }
            catch (Exception ex)
            {
                //Registro log de ejecucion con problemas
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Ejecucion_Problemas);
                //Genero error
                throw new ManagerException(Factoria.GetMessage("DOM_ERROR_NO_MANEJADO"), ex);
            }
            return RespuestaBuscar;

        }


        public List<RegistroContableDTO> BuscarRegistroContableByEgresoLike(ContextoDTO p_Contexto, RegistroContableDTO regCont)
        {
            //Prefijo del Metodo
            const string MPREFIX = " [BuscarRegistroContableByEgreso(ContextoDTO, RegistroContableDTO)]";
            //Crea lista de objetos de salida
            List<RegistroContableDTO> RespuestaBuscar = new List<RegistroContableDTO>();

            try
            {
                //Registro log de inicio del proceso
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Inicio);

                //Valida que exista informacion a insertar
                AssertNull.notNullOrEmpty(regCont);

                //Obtengo la lista de objetos almacenados en la base de datos
                RespuestaBuscar = iRegistroContableDAO.BuscarRegistroContableByEgresoLike(regCont);

                //Registro log de termino OK del proceso
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Ejecucion_Ok);
                //Registro log de ejecucion el termino del metodo
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Termino);
            }
            catch (ManagerException me)
            {
                throw (me);
            }
            catch (ArquitecturaException ae)
            {
                throw (ae);
            }
            catch (Exception ex)
            {
                //Registro log de ejecucion con problemas
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Ejecucion_Problemas);
                //Genero error
                throw new ManagerException(Factoria.GetMessage("DOM_ERROR_NO_MANEJADO"), ex);
            }
            return RespuestaBuscar;

        }


        public List<RegistroContableDTO> BuscarRegistroContableByIngreso(ContextoDTO p_Contexto, RegistroContableDTO regCont)
        {
            //Prefijo del Metodo
            const string MPREFIX = " [BuscarRegistroContableByIngreso(ContextoDTO, RegistroContableDTO)]";
            //Crea lista de objetos de salida
            List<RegistroContableDTO> RespuestaBuscar = new List<RegistroContableDTO>();

            try
            {
                //Registro log de inicio del proceso
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Inicio);

                //Valida que exista informacion a insertar
                AssertNull.notNullOrEmpty(regCont);

                //Obtengo la lista de objetos almacenados en la base de datos
                RespuestaBuscar = iRegistroContableDAO.BuscarRegistroContableByIngreso(regCont);

                //Registro log de termino OK del proceso
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Ejecucion_Ok);
                //Registro log de ejecucion el termino del metodo
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Termino);
            }
            catch (ManagerException me)
            {
                throw (me);
            }
            catch (ArquitecturaException ae)
            {
                throw (ae);
            }
            catch (Exception ex)
            {
                //Registro log de ejecucion con problemas
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Ejecucion_Problemas);
                //Genero error
                throw new ManagerException(Factoria.GetMessage("DOM_ERROR_NO_MANEJADO"), ex);
            }
            return RespuestaBuscar;

        }

    #endregion metodos publicos

	}//End class SucursalDom
}//End namespace





